home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Libris Britannia 4
/
science library(b).zip
/
science library(b)
/
DTP
/
DTP_TEX
/
3239.ZIP
/
DVIMTP.ZIP
/
LOADCHAR.H
< prev
next >
Wrap
Text File
|
1986-11-13
|
3KB
|
67 lines
/* -*-C-*- loadchar.h */
/*-->loadchar*/
/**********************************************************************/
/****************************** loadchar ******************************/
/**********************************************************************/
void
loadchar(c)
BYTE c; /* character number in current font */
/***********************************************************************
This simple version will do for now. Even in a book DVI file, there
are unlikely to be more than about 25 fonts used and with an average
of 50 characters each, this is about 1250 character definitions.
With typical character sizes of 10 point type on a 300 dots/inch
device, each would take a block of (10/72)*300 = 42 dots square, or
about 84 words each, for a total storage requirement of 84*1250 =
105000 words. This is quite reasonable for the DEC-20/60 and VAX
Unix implementations, and may be acceptable on large memory
microprocessors like the MC68000 and NS16000.
However, for future expansion, a reference count of each character
is maintained, and the total storage allocated for character
descriptions is recorded. Then, when malloc fails, or MAXCACHE is
reached, the font entries can be scanned to find the least used
characters whose raster storage can then be freed and malloc
retried.
***********************************************************************/
{
void (*charyy)(); /* subterfuge to get around PCC-20 bug */
register UNSIGN32 nwords; /* how many 32-bit words we need */
register struct char_entry *tcharptr;
if ((c < FIRSTPXLCHAR) || (LASTPXLCHAR < c)) /* check character range */
return;
tcharptr = &(fontptr->ch[c]);
if (!VISIBLE(tcharptr)) /* check for empty character rasters */
return;
nwords = (UNSIGN32)(((tcharptr->wp+31) >> 5) * (tcharptr->hp));
tcharptr->rasters = (UNSIGN32*)MALLOC((unsigned)(nwords*sizeof(UNSIGN32)));
if (tcharptr->rasters == (UNSIGN32*)NULL)
{
(void)sprintf(message,"loadchar(): Could not allocate %ld words of \
raster space--used %ld words so far",
(long)nwords,(long)cache_size);
(void)fatal(message);
}
tcharptr->refcount = 0; /* clear reference count */
cache_size += (INT32)nwords; /* update cache size record */
if (fontptr != pfontptr)
openfont(fontptr->n);
if (fontfp == (FILE *)NULL) /* do nothing if no font file */
return;
/* Bug workaround: PCC-20 otherwise jumps to charxx instead of *charxx */
charyy = fontptr->charxx;
(void)(*charyy)(c,outrow); /* load character from font file */
}